#include <iostream>
using namespace std;
// 共同基类
class A
{
public:
    int value = 0;
    A() { std::cout << "A()  @" << this << '\n'; }
};

// 普通继承（没有 virtual）
// class B :  public A
class B : virtual public A
{
public:
    B() { std::cout << "B()  —  B 部分的 A::value=" << A::value << '\n'; }
};

class C : virtual public A
{
public:
    C() { std::cout << "C()  —  C 部分的 A::value=" << A::value << '\n'; }
};

// 最底层派生类
class D : public B, public C
{
public:
    D()
    {
        std::cout << "D()  — 现在有两份 A 子对象！\n";
    }
};

int main()
{
    D d;
    // 1、普通继承存在问题
    // 是因为B、C都继承自A,D实例化会创建两个A
    // "D::value" 不明确
    // cout << d.value << endl;
    d.B::value = 998;
    cout << d.B::value << endl;
    cout << d.C::value << endl;

    // 普通继承 = 每条继承路径都带一份基类子对象；
    // virtual 继承 = 所有路径共享唯一一份虚基类子对象
}